// 验证名称的公共方法
export const validateName = (rule, value, callback) => {
  //验证只能填入数字
  var reg = new RegExp('^[./\u4E00-\u9FA5()a-zA-Z0-9_-]*$');
  //验证警戒值
  if (value) {
    if (!reg.test(value)) {
      callback(new Error('请输入中文、数字、字母、点、英文括号、下划线或者中划线'));
    } else {
      callback();
    }
  } else {
    callback();
  }
};
// chinese 中文 number 数字 letter 字母 underline 下划线 special character 特殊字符
export const nameErrorTipCNLU = '请输入中文、数字、字母、下划线'; //或者中划线
export const validateNameCNLU = (rule, value, callback) => {
    //验证只能填入数字
    var reg = new RegExp('^[\u4E00-\u9FA5a-zA-Z0-9_]*$');
    //验证警戒值
    if (value) {
        if (!reg.test(value)) {
            callback(new Error('请输入中文、数字、字母、下划线'));
        } else {
            callback();
        }
    } else {
        callback();
    }
};
export const nameErrorTipNLU = '请输入数字、字母、下划线';
export const validateNameNLU = (rule, value, callback) => {
    //验证只能填入数字
    var reg = new RegExp('^[a-zA-Z0-9_]*$');
    //验证警戒值
    if (value) {
        if (!reg.test(value)) {
            callback(new Error(nameErrorTipNLU));
        } else {
            callback();
        }
    } else {
        callback();
    }
};
// 获取验证1~指定最大值范围的整数的验证方法
export const getNumReg = (maxNum, minNum = 1) => {
  return (rule, value, callback) => {
    //验证只能填入数字
    if (value !== 0 && !value) {
      callback(new Error('不能为空'));
      return;
    }
    if (!Number.isInteger(value)) {
      callback(new Error('请输入整数'));
      return;
    }
    if (maxNum && value < minNum || value > maxNum) {
      callback(new Error(`输入范围:${minNum}~${maxNum}`));
      return;
    }
    callback();
  };
};
// import { nameErrorTip,nameErrorTip128 } from './tip.js';
export const nameErrorTip = `不能包含下列任意英文字符 \\ / : * ? " < > |，长度为1-64个字符`;
// 验证名称
// ？‘’“”
export const validateName1 = (rule, value, callback) => {
  //验证只能填入数字
  let reg = /[\\/:*?"<>|]/gi;
  //验证警戒值
  if (value) {
    if (reg.test(value) || value.length < 1 || value.length > 64) {
      callback(new Error(nameErrorTip));
    } else {
      callback();
    }
  } else {
    callback();
  }
};

export const nameErrorTip128 = '不能包含下列任意英文字符 \\ / : * ? " < > |，长度为1-128个字符';
//
export const validateName128 = (rule, value, callback) => {
  //验证只能填入数字
  let reg = /[\\/:*?"<>|]/gi;
  //验证警戒值
  if (value) {
    if (reg.test(value) || value.length < 1 || value.length > 128) {
      callback(new Error(nameErrorTip128));
    } else {
      callback();
    }
  } else {
    callback();
  }
};

//
export const validateNameCustom = (rule, value, callback, length = 64) => {
  //验证只能填入数字
  let reg = /[\\/:*?"<>|]/gi;
  //验证警戒值
  if (value) {
    if (reg.test(value) || value.length < 1 || value.length > length) {
      callback(new Error(`不能包含下列任意英文字符 \\ / : * ? " < > |，长度为1-${length}个字符`));
    } else {
      callback();
    }
  } else {
    callback();
  }
};

export const newValidationRules = /[\\/:*?"<>|]/gi;
export const newValidationRulesTip = (name = '名称', length) => {
  return `${name}不能包含下列任意英文字符 \\ / : * ? " < > |，长度为1-${length}个字符`
}

export const numberAndLetterTip = '请输入字母或数字';
export const validateNumberAndLetter = (rule, value, callback) => {
  const reg = /^[a-zA-Z0-9]+$/
  // const reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]$/
  if(value){
    if (!reg.test(value)) {
      callback(new Error(numberAndLetterTip));
    } else {
      callback();
    }
  }else{
    callback()
  }
}

export const numberLetterPointTip = '请输入字母、数字或点';
export const validateNumberLetterPoint = (rule, value, callback) => {
  const reg = /^[a-zA-Z0-9.]+$/
  // const reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]$/
  if(value){
    if (!reg.test(value)) {
      callback(new Error(numberLetterPointTip));
    } else {
      callback();
    }
  }else{
    callback()
  }
}

export const domainTip = '请输入字母、数字或点，点不能连续出现也不能放在开头和结尾';
export const validateDomain = (rule, value, callback) => {
  const reg =  /^(?!.*\.{2})[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*$/
  if(value){
    if (!reg.test(value)) {
      callback(new Error(domainTip));
    } else if(value.length > 20){
      callback(new Error('域名长度不能超过20个字符'));
    }else {
      callback();
    }
  }else{
    callback()
  }
}
// 验证IP
export const validateIp = (rule, value, callback) => { //验证只能填入数字
  //验证警戒值
  if (value) {
    if (!/^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$/.test(value)) {
      callback(new Error('IP格式不正确'));
    } else {
      callback()
    }
  } else {
    callback()
  }
}
export const validateUrlShort1 = (rule, value, callback) => {
  let reg = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i
  //验证警戒值
  if (value) {
    if (reg.test(value)) {
      callback();
    } else {
      callback('请输入以http、https或ftp开头的访问地址如：http://www.baidu.com')
    }

  } else {
    callback('请输入以http、https或ftp开头的访问地址如：http://www.baidu.com')
  }
}
//验证端口
export const validatePort = (rule, value, callback) => {
  if (value) {
    var porttest = /^([0-9]|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{4}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
    let arr = value.split(',');
    let flag = arr.every(item => {
      item = item * 1;
      return porttest.test(item)
    })
    if (!flag) {
      callback(new Error('所有端口范围请输入0-65535之间的数字'))
    } else {
      callback()
    }
    // if (!porttest.test(value)) {
    //     // this.$message.error('有端口信息不合规，请检查！');
    //     // return false;
    //     callback(new Error('端口输入错误'))
    // } else {
    //     callback()
    // }
  } else {
    callback()
  }
}
export const validateUrl = (rule, value, callback) => {
  //验证警戒值
  if (value) {
    if (!/^((https|http|ftp|rtsp|mms)?:\/\/)([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?$/.test(value)) {
      callback(new Error('url格式不正确'));
    }
    callback()
  } else {
    callback()
  }
}

//验证网址
export const validateSite = (rule, value, callback) => {
  if (value) {
    // //const reg = /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$/;
    // const reg1 = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+)\.)+([A-Za-z0-9-~\/])+$/;
    // const reg = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)((2[0-4][0-9])|(25[0-5])|(1[0-9]{0,2})|([1-9][0-9])|([1-9]))\.(((2[0-4][0-9])|(25[0-5])|(1[0-9]{0,2})|([1-9][0-9])|([0-9]))\.){2}((2[0-4][0-9])|(25[0-5])|(1[0-9]{0,2})|([1-9][0-9])|([1-9]))$/;
    let flag = true;
    try {
      const parsedUrl = new URL(value);
      // 检查协议是否合法
      if (!/^https?:$/.test(parsedUrl.protocol)) {
        flag = false;
      }
      // 检查主机名是否合法
      const hostname = parsedUrl.hostname;
      if (!/^[a-z\d.-]+$/i.test(hostname)) {
        flag = false;
      }
      // 检查端口号是否合法
      const port = parsedUrl.port;
      if (port && (!/^\d+$/.test(port) || port > 65535)) {
        flag = false;
      }
      // 检查 IP 地址是否合法
      if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(hostname)) {
        const parts = hostname.split('.');
        if (parts.some(part => parseInt(part, 10) > 255)) {
          flag = false;
        }
      }
    } catch (error) {
      flag = false
    }
    if (flag) {
      callback()
    } else {
      callback(new Error('请输入正确的网站地址'))
    }
  } else {
    callback()
  }
};

export const validateEmail = (rule, value, callback) => {
  const email = `com org net int edu gov mil arpa
    ac ad ae af ag ai al am an ao aq ar as at aw ax az
    ba bb bd be bf bg bh bi bj bl bm bn bo bq br bs bt bv bw by bz
    ca cc cd cf cg ch ci ck cl cm cn co cr cu cv cw cx cy cz
    de dj dk dm do dz
    ec ee eg eh er es et eu
    fi fj fk fm fo fr
    ga gb gd ge gf gg gh gi gm gn gp gq gr gs gt gu gw gy
    hk hm hn hr ht hu
    id ie il im in io iq ir is it
    je jm jo jp
    ke kg kh ki km kn kp kr kw ky kz
    la lb lc li lk lr ls lt lu lv ly
    ma mc md me mf mg mh mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz
    na nc ne nf ng ni nl no np nr nu nz
    om
    pa pe pf pg ph pk pl pm pn pr ps pt pw py
    qa
    re ro rs ru rw
    sa sb sc sd se sg sh si sj sk sl sm sn so sr ss st su sv sx sy sz
    tc td tf tg th tj tk tl tm tn to tp tr tt tv tw tz
    ua ug uk um us uy uz
    va vc ve vg vi vn vu
    wf ws
    ye yt
    za zm zw`;
  const rexg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
  const checkEmail = email.split(' ')
  if (value) {
    const emailName = value.split('.');
    const len = emailName.length;
    if (!rexg.test(value)) {
      callback(new Error('请输入正确的邮箱地址'))
    } else if (rexg.test(value) && !checkEmail.includes(emailName[len - 1])) {
      callback(new Error('请输入正确的邮箱地址'))
    } else {
      callback()
    }
  } else {
    callback()
  }
};
function phoneValidate(value, callback) {
  const reg = /^((\+86)?(13[0-9]|14[579]|15[0-35-9]|16[56]|17[0135678]|18[0-9]|19[89])\d{8})$|^((\d{3,4}-)?\d{7,8})$|^(\d{7,8})$/;
  if (reg.test(value)) {
    callback()
  } else {
    callback(new Error('请输入正确的号码'))
  }
}
export const validatePhone = (rule, value, callback) => {
  if (value) {
    phoneValidate(value, callback)
  } else {
    callback(new Error('请输入号码'))
  }
};
//验证电话号码
export const validateTelephone = (rule, value, callback) => {
  //验证警戒值
  if (value) {
    if (!/^(\(\d{3}\)|\d{3}[.-]?)?\d{3}[.-]?\d{4,5}$/.test(value)) {
      callback(new Error('电话号码格式不正确'));
    }
    callback()
  } else {
    callback()
  }
}
export const validatePhoneNotRequired = (rule, value, callback) => {
  if (value) {
    phoneValidate(value, callback)
  } else {
    callback()
  }
};
